#define _CRT_SECURE_NO_WARNINGS
//作者：宋安康
//#include<bits/stdc++.h>
//using namespace std;
//const int N = 1e3 + 9;
//int n, m;
//int a[N], b[N], dp[N][N];
//
////动态规划基础
//LCS算法：求最长公共子序列

//int main() 
//{
//	int n, m;
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)  cin >> a[i];
//	for (int i = 1; i <= m; i++)  cin >> b[i];
//	for (int i = 1; i <=  n; i++)
//	{
//		for (int j = 1;j <= m; j++)
//		{
//			if (a[i] == b[j])
//			{
//				dp[i][j] = dp[i - 1][j - 1] + 1;
//			}
//			else {
//				dp[i][j] = max(dp[ i -1][j],dp[i][j - 1]);
//			}
//		}
//	}
//	cout << dp[n][m] << endl;
//	printf("hello world\n");
//	return 0;
//}

//LIS最长上升子序列

//区间DP
 //以区间为尺度的DP

//const int N = 1e3 + 9;
//int a[N];
//int main() 
//{
//	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//	int n;
//	cin >> n;
//	for (int i = 1; i <= n; ++i)cin >> a[i];
//
//
//	return 0;
//}

//线性DP


//数位DP:对数位进行DP
//算法概述
//枚举每一位--控制上界

//01tire
//字典树

//int main()
//{
//	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//
//
//	return 0;
//
//}

//KMP算法
//字符串匹配算法
//

//数组实现链表，栈堆队列
//单链表和双链表

//int main() 
//{
//	for (int i = 2; i < 2021; i++)
//	{
//		printf("%d ",i);
//	}
//	return 0;
//}
//
//#include<bits/stdc++.h>
//using namespace std;

//int main()
//{
//    int ans = 0;
//    //ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//    for (int i = 1; i <= 2020; ++i)
//    {
//        int f = i;
//        while (f)
//        {
//            if (f % 10 == 2)ans++;
//            f = f / 10;
//        }
//
//    }
//    cout << ans;
//
//    return 0;
//}

//#include<bits/stdc++.h>
//using namespace std;
//int ans = 0;
//
//bool rec_years(int year)
//{
//    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)return true;
//    return false;
//
//
//}
//int main()
//{
//    int ret;
//    for (int i = 1901; i <= 2000; i++)
//    {
//        if (rec_years(i))ans++;
//        ret = (365 * 100 + ans) / 7;
//
//
//    }
//    cout << ret << endl;
//    return 0;
//
//}

//#include<bits/stdc++.h>
//using namespace std;
//int main()
//{
//
//    int cnt2 = 0;
//    int cnt5 = 0;
//    for (int i = 1; i <= 10; i++)
//    {
//        for (int j = 1; j <= 10; j++)
//        {
//            int ans;
//            cin >> ans;
//            while (ans % 2 == 0)
//            {
//                cnt2++;
//                ans = ans / 2;
//            }
//            while (ans % 5 == 0)
//            {
//                cnt5++;
//                ans = ans / 5;
//            }
//
//        }
//
//    }
//    cout << min(cnt2, cnt5) << endl;
//    return 0;
//
//
//}
// #include<bits/stdc++.h>
//#include <map>
//using namespace std;
//
//map<string, bool> mp;
//int main()
//{
//
//    int n;
//    string ans = "NO";
//    cin >> n;
//    for (int i = 0; i < n; i++)
//    {
//        string word;
//        cin >> word;
//        if (mp.count(word)) {
//            ans = word;
//            break;
//        }
//
//        else mp[word] = 1;
//    }
//    cout << ans << endl;
//
//}

//#include<bits/stdc++.h>
//using namespace std;
//vector<string> city;
//vector<string> dig[1000];
//int MyFind(string c)
//{
//    for (int i = 0; i < city.size(); i++)
//    {
//        if (city[i] == c)return i;
//    }
//    return -1;
//}
//int main()
//{
//    int n;
//    cin >> n;
//    for (int i = 1; i <= n; i++)
//    {
//        string d, c;
//        cin >> d >> c;
//        int flag = MyFind(c);
//        if (flag == -1)
//        {
//            city.push_back(c);
//            dig[city.size() - 1].push_back(d);
//        }
//        else
//        {
//            dig[flag].push_back(d);
//        }
//
//    }
//    for (int i = 0; i <= city.size() - 1; i++)
//    {
//        cout << city[i] << " " << dig[i].size() << endl;
//        for (int j = 1; j <= dig[i].size(); j++)
//        {
//            cout << dig[i][j] << endl;
//
//        }
//    }
//    return 0;
//}
//#include<bits/stdc++.h>
//using namespace std;
//int a[7];
//vector<int> ans[10];
//int main()
//{
//    for (int i = 1; i <= 6; i++)
//    {
//        char c;
//        cin >> c;
//        if (c == 'A')a[i] = 1;
//        else if (c == 'K')a[i] = 13;
//        else if (c == 'Q')a[i] = 12;
//        else if (c == 'T')a[i] = 11;
//        else
//        {
//            a[i] = (c - '0');
//        }
//
//    }
//    ans[0].push_back(a[1]);
//    for (int i = 1; i <= 5; i++)
//    {
//        for (int j = 0; j < ans[i].size(); j++)
//        {
//            ans[i].push_back(ans[i - 1][j] + a[i + 1]);
//            ans[i].push_back(ans[i - 1][j] - a[i + 1]);
//            ans[i].push_back(ans[i - 1][j] * a[i + 1]);
//            ans[i].push_back(ans[i - 1][j] / a[i + 1]);
//        }
//    }
//    int flag = 0;
//    for (int i = 0; i < ans[5].size(); i++) {
//        if (ans[5][i] == 42)
//        {
//            flag = 1;
//            break;
//        }
//        if (flag == 1)
//        {
//            cout << "YES" << endl;
//        }
//        else
//        {
//            cout << "NO" << endl;
//        }
//        return 0;
//
//    }
//}

#include<bits/stdc++.h>
using namespace std;
vector<string> name;
vector<string> ans;
vector<int> chosen;
int n, m;

void calc(int x)
{
    if (chosen.size() > m || chosen.size() + (n - x + 1) < m)return;
    if (x == n + 1)
    {
        string ansTem = "";
        for (int i = 0; i < chosen.size(); i++)
        {
            ansTem += name[chosen[i] - 1] + "";
            ans.push_back(ansTem);
            return;
        }
        chosen.push_back(x);
        calc(x + 1);
        chosen.pop_back();
        calc(x + 1);
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        string s;
        cin >> s;
        name.push_back(s);

    }
    calc(1);
    for (int i = 0; i < ans.size(); i++)
    {
        cout << ans[i] << endl;
    }

}